#ifndef CLIENT_H_
#define CLIENT_H_

//boost headers
#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/bind.hpp>

//std headers
#include <string>

//project headers
#include "CLTConnection.h"
#include "DataContainer.h"


//! Client
/*!
	Trieda predstavujuca TCP/IP clienta, na realizaciu komunikacie
	s serverom.
*/
class Client : public boost::enable_shared_from_this<Client>
{
	public:
		//! Konstruktor
		/*!
			\param theAdress predstavuje adresu servera
			\param thePort	 predstavuje cislo portu kam sa ma pripojit
		*/
		Client(std::string& theAdress,std::string& thePort);

		//! Connect
		/*!
			Funkcia sluzi na uskutocnenie spojenia. O uspechu naviazania
			spojenia sa da presvedcit pomocou funkcie IsConnected()
		*/
		void Connect();

		//! Write
		/*!
			Funkcia sluzi na zapis dat do sietoveho spojenia
			\param theData data ktore sa maju poslat na stranu servera
		*/
		void Write(PComunicator::DataContainer theContainer);

		//! Read
		/*!
			NOT IMPLEMENTED!
		*/
		void Read(void);
		

		//! IsConnected
		/*!
			Funkcia na zistenie ci sa uspesne pripojilo alebo ne
			\return true ak uspesne spojenie, false inak
		*/
		bool IsConnected(void);

	private:
		//////////////////////////////////////////////////////////////////////////
		//							MEMBER FUNCTIONS
		//////////////////////////////////////////////////////////////////////////
		void handle_connect(const boost::system::error_code& er,boost::asio::ip::tcp::resolver::iterator endpoint_iter);
		
		
		//! Write
		/*!
			Funkcia sluzi na zapis dat vacsich ako 8192 b. Funkcia rozdeli
			data na casti o velkosti 8192 a potom nasledne posiela tieto casti
			\param input data ktore sa maju poslat na stranu servera
		*/
		void write_data(std::vector<unsigned char> &input);

		void copy(std::vector<unsigned char> input,std::size_t down_index,std::size_t up_index, std::vector<char> &output);
		//////////////////////////////////////////////////////////////////////////
		//							MEMBER VARIABLES
		//////////////////////////////////////////////////////////////////////////
		std::string myAdress;
		std::string myPort;
		bool myConnected;
		boost::asio::io_service myIo_service;
		CLTConnection myConnection;
};

#endif